package com.xiepei.day01;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * 第3课：ArrayList 进阶操作
 * 目标：学会查找索引、排序、批量操作、转换数组等
 * 
 * 这些操作在实际开发中非常常用！
 */
public class Lesson03_ArrayList进阶操作 {
    public static void main(String[] args) {
        // 1. 查找元素的索引位置
        System.out.println("=== 1. 查找索引 ===");
        List<String> list = new ArrayList<>();
        list.add("张三");
        list.add("李四");
        list.add("王五");
        list.add("李四");  // 重复元素
        
        int index1 = list.indexOf("李四");  // 查找第一个"李四"的索引
        int index2 = list.lastIndexOf("李四");  // 查找最后一个"李四"的索引
        System.out.println("第一个'李四'的索引：" + index1);
        System.out.println("最后一个'李四'的索引：" + index2);
        System.out.println("查找不存在的元素：" + list.indexOf("赵六"));  // 返回-1
        System.out.println();
        
        // 2. 排序（按字母顺序）
        System.out.println("=== 2. 排序 ===");
        List<String> names = new ArrayList<>();
        names.add("王五");
        names.add("张三");
        names.add("李四");
        names.add("赵六");
        
        System.out.println("排序前：" + names);
        Collections.sort(names);  // 按字母顺序排序
        System.out.println("排序后：" + names);
        System.out.println();
        
        // 3. 批量添加元素（addAll）
        System.out.println("=== 3. 批量添加 ===");
        List<String> list1 = new ArrayList<>();
        list1.add("A");
        list1.add("B");
        
        List<String> list2 = new ArrayList<>();
        list2.add("C");
        list2.add("D");
        list2.add("E");
        
        list1.addAll(list2);  // 把list2的所有元素添加到list1
        System.out.println("合并后list1：" + list1);
        System.out.println();
        
        // 4. 转换为数组
        System.out.println("=== 4. 转换为数组 ===");
        List<String> list3 = new ArrayList<>();
        list3.add("苹果");
        list3.add("香蕉");
        list3.add("橙子");
        
        // 方式1：转换为Object数组
        Object[] arr1 = list3.toArray();
        System.out.println("Object数组：" + Arrays.toString(arr1));
        
        // 方式2：转换为指定类型的数组（推荐）
        String[] arr2 = list3.toArray(new String[0]);
        System.out.println("String数组：" + Arrays.toString(arr2));
        System.out.println();
        
        // 5. 从数组创建列表
        System.out.println("=== 5. 从数组创建列表 ===");
        String[] fruits = {"苹果", "香蕉", "橙子"};
        List<String> list4 = new ArrayList<>(Arrays.asList(fruits));
        System.out.println("从数组创建的列表：" + list4);
        System.out.println();
        
        // 6. 获取子列表（类似 JS 的 arr.slice(1, 3)）
        System.out.println("=== 6. 获取子列表 ===");
        List<String> list5 = new ArrayList<>();
        list5.add("A");
        list5.add("B");
        list5.add("C");
        list5.add("D");
        list5.add("E");
        
        List<String> subList = list5.subList(1, 4);  // 获取索引1到3的元素（不包含4）
        System.out.println("原列表：" + list5);
        System.out.println("子列表（索引1-3）：" + subList);
        System.out.println();
        
        // 7. 检查两个列表是否相等
        System.out.println("=== 7. 比较列表 ===");
        List<String> list6 = new ArrayList<>();
        list6.add("A");
        list6.add("B");
        
        List<String> list7 = new ArrayList<>();
        list7.add("A");
        list7.add("B");
        
        List<String> list8 = new ArrayList<>();
        list8.add("B");
        list8.add("A");
        
        System.out.println("list6 == list7：" + list6.equals(list7));  // true，元素相同
        System.out.println("list6 == list8：" + list6.equals(list8));  // false，顺序不同
        System.out.println();
        
        // 8. 复制列表
        System.out.println("=== 8. 复制列表 ===");
        List<String> original = new ArrayList<>();
        original.add("X");
        original.add("Y");
        original.add("Z");
        
        // 方式1：使用构造函数（浅拷贝）
        List<String> copy1 = new ArrayList<>(original);
        copy1.set(0, "修改了");
        System.out.println("原列表：" + original);
        System.out.println("副本1：" + copy1);
        
        // 方式2：使用addAll
        List<String> copy2 = new ArrayList<>();
        copy2.addAll(original);
        System.out.println("副本2：" + copy2);
    }
}

